<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 练习题 4：记忆化函数
      // 创建一个记忆化函数，该函数使用闭包来存储已经计算过的值，以便在后续调用时能够快速返回结果，而不是重新计算。

      function memorize(fn) {
        const cache = {};
        return function (...args) {
          const key = JSON.stringify(args);
          let result = null;
          console.log(key);
          if (cache[key]) {
            result = cache[key];
          } else {
            result = fn(...args);
            cache[key] = result;
          }
          console.log(cache);
          return result;
        };
      }

      const add = (a, b) => a + b;
      const memoizedAdd = memorize(add);
      console.log(memoizedAdd(1, 2, 3, 4)); // 第一次调用，应该输出 3
      console.log(memoizedAdd(1, 3, 2)); // 第二次调用，应该立即输出 3，因为结果已经被缓

      /*
      总结：
      学会了：
      1.使用闭包来实现记忆化函数，通过缓存已经计算过的结果，避免重复计算。
      2.键值的生成：使用JSON.stringify将参数转换为字符串，作为键值。
      3.
      */
    </script>
  </body>
</html>
